(#1471): base64-encode included SVGs to avoid mis-escaped characters
authorFederico Mena Quintero <federico@gnome.org>
Tue, 27 Nov 2018 18:13:31 +0000 (12:13 -0600)
committerFederico Mena Quintero <federico@gnome.org>
Tue, 27 Nov 2018 19:57:21 +0000 (13:57 -0600)
We wrap SVG data from icons within another SVG with extra styling
information.  The wrapped SVG may contain characters that cannot be
part of a data: URL (https://fetch.spec.whatwg.org/#data-urls).

Librsvg 2.45 got more strict in its parsing of data: URLs; whereas
previously it ignored '#' characters in them, now it considers them to
be the start of a fragment identifier, which is not allowed in data:
URLs anyway.

To avoid unallowed characters, we now create a data: URL with a
base-64 encoded SVG.

Fixes https://gitlab.gnome.org/GNOME/gtk/issues/1471

gtk/gtkicontheme.c
gtk/tools/gdkpixbufutils.c

index e728b0bdb7a417e213867d2fcc3b342dc39653b1..1958b7d133beb0e0e157b53b0c33cdd850e1893e 100644 (file)
@@ -4144,7 +4144,7 @@ gtk_icon_info_load_symbolic_svg (GtkIconInfo    *icon_info,
   width = g_strdup_printf ("%d", icon_info->symbolic_width);
   height = g_strdup_printf ("%d", icon_info->symbolic_height);
 
-  escaped_file_data = g_markup_escape_text (file_data, file_len);
+  escaped_file_data = g_base64_encode ((guchar *) file_data, file_len);
   g_free (file_data);
 
   g_ascii_dtostr (alphastr, G_ASCII_DTOSTR_BUF_SIZE, CLAMP (alpha, 0, 1));
@@ -4169,7 +4169,7 @@ gtk_icon_info_load_symbolic_svg (GtkIconInfo    *icon_info,
                       "      fill: ", css_success, " !important;\n"
                       "    }\n"
                       "  </style>\n"
-                      "  <g opacity=\"", alphastr, "\" ><xi:include href=\"data:text/xml,", escaped_file_data, "\"/></g>\n"
+                      "  <g opacity=\"", alphastr, "\" ><xi:include href=\"data:text/xml;base64,", escaped_file_data, "\"/></g>\n"
                       "</svg>",
                       NULL);
   g_free (escaped_file_data);
index b47ebf9df89216fa7301c731af62207ca51cd32a..0ed23bd3dcdc4b78835a749d82276859f83f2598 100644 (file)
@@ -178,7 +178,7 @@ load_symbolic_svg (const char     *file_data,
   svg_height = g_strdup_printf ("%d", gdk_pixbuf_get_height (pixbuf));
   g_object_unref (pixbuf);
 
-  escaped_file_data = g_markup_escape_text (file_data, file_len);
+  escaped_file_data = g_base64_encode ((guchar *) file_data, file_len);
 
   data = g_strconcat ("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
                       "<svg version=\"1.1\"\n"
@@ -200,7 +200,7 @@ load_symbolic_svg (const char     *file_data,
                       "      fill: ", css_success, " !important;\n"
                       "    }\n"
                       "  </style>\n"
-                      "  <xi:include href=\"data:text/xml,", escaped_file_data, "\"/>\n"
+                      "  <xi:include href=\"data:text/xml;base64,", escaped_file_data, "\"/>\n"
                       "</svg>",
                       NULL);
   g_free (escaped_file_data);